﻿using System;
using System.Collections.Generic;
using FacensaNet.BudgetDotCom.DomainModel;
namespace FacensaNet.BudgetDotCom.DataAbstractionLayer.Core
{
    public interface IDataAccessObject<T> : IDisposable
     where T : class, IEntidade, new()
    {
        /// <summary>
        /// Busca de entidade por id.
        /// </summary>
        /// <param name="id">O id a ser procurado.</param>
        /// <returns>
        /// Uma instância de uma entidade com o id passado, caso seja encontrada.
        /// Caso não seja encontrada, retornará <c>null</c>.
        /// </returns>
        T BuscaPorId(int id);

        /// <summary>
        /// Busca elementos que contenham uma determinada <c>string</c> em seu nome.
        /// </summary>
        /// <param name="nome">
        /// O nome a ser usado. A busca retornará entidades que contenham essa estring.
        /// </param>
        /// <returns>
        /// Uma lista de entidades que batem com o critério de busca.
        /// </returns>
        IEnumerable<T> BuscaPorNome(string nome);

        /// <summary>
        /// Buscas todos os elementos da tabela.
        /// </summary>
        /// <returns>
        /// Uma lista contendo todos os elementos da tabela.
        /// </returns>
        IEnumerable<T> BuscaTodos();

        /// <summary>
        /// Cria uma nova instância da entidade manipulada por esse DAO.
        /// </summary>
        /// <returns>
        /// Uma nova instância da entidade que esse DAO manipula.
        /// </returns>
        /// <remarks>
        /// Entidades deveriam sempre ser criadas através deste método de
        /// fábrica, já que a DAL pode precisar executar algum código de 
        /// inicialização para elas.
        /// </remarks>
        T CriaEntidade();
    }
}
